﻿/*
 * 提供给void QWebChannel::registerObject(const QString &id, QObject *object)注册的辅助类;
 * 注册完成后在前端可以通过创建js端的QWebChannel对象调用到这个辅助类中的槽函数或者变量
*/
#ifndef WEB_CLIENT_BRIDGE_H
#define WEB_CLIENT_BRIDGE_H
#include <QObject>
#include <QtWebChannel>
#include <QDebug>
#include "developtool.h"

class WebClientBridge : public QObject
{
    Q_OBJECT
    /*
     * 更在类型之后的就是你要注册的公开变量(属性)的名称
     * 注册的属性名称并不一定要和要改变的成员变量名称一致,但写成一致更容易使用
     *
     * 注册公开变量(属性)是给js调用使用的,c++端还是使用的还是原始变量名或者直接调用相关成员函数
     * 注意c++端直接使用的原始变量名更改数据前端是无法检测到更改的,若需要前端也获取到这个数据的变更,需要使用 NOTIFY 绑定信号,并在 WRITE
     * 绑定的函数中主动发射这个 NOTIFY 绑定的信号,发射之后前端会自动处理这个信号并调用 READ 绑定的函数重新获取一次值,以此来完成数据同步
     * 使用Q_PROPERTY宏板是不区分修饰符的(私有,公有,继承三种都是可以的),只要在当前类中有的成员变量和成员函数都可以板顶
     */
    Q_PROPERTY(QString someattribute_test READ  getSomeattribute_1 WRITE setSomeattribute_1 NOTIFY someattribute_1_change )
    Q_PROPERTY(QString someattribute_2 READ getSomeattribute_2 WRITE setSomeattribute_2 NOTIFY someattribute_2_change)
public:
    explicit WebClientBridge(QObject *parent = nullptr);
    QString someattribute_1;

    QString getSomeattribute_2(){
        qDebug()<<"getSomeattribute_2"<<someattribute_2;
        return someattribute_2;
    }
    void setSomeattribute_2(const QString &new_someattribute_2){
        someattribute_2 = new_someattribute_2;
        qDebug()<<"setSomeattribute_2"<<someattribute_2;
        emit someattribute_2_change();
    }
private:
    //本地调试调试端口
    QString str_port;
    //前开发者窗口对象
    DevelopTool* myDevelopTool;

    QString getSomeattribute_1(){
        qDebug()<<"getSomeattribute_1"<<someattribute_1;
        return someattribute_1;
    }
    void setSomeattribute_1(const QString &new_someattribute_1){
        someattribute_1 = new_someattribute_1;
        qDebug()<<"setSomeattribute_1"<<someattribute_1;
        emit someattribute_1_change();
    }

    QString someattribute_2;

public slots:
    /*
     * (1)前端js调用QT代码的函数,一定要写在public slots:中,注意，形参前的" const "不能被省略，
     * 否则会得到以下错误:无法将参数QJsonValue(string， " sd ")转换为目标类型。
     *
     * (2)若是一个函数只是提供给前端修改变量的值,我们则可以不写这个函数,
     * 而是直接通过宏Q_PROPERTY将变量注册为辅助类的公开变量(相当于直接注册为属性),
     * 这里的公开是指js代码和c++代码都可以直接操作这个变量,并不是指3变量的修饰符public
     * 例如你可以将一个private修饰的变量注册为辅助类的公开变量
    */
    void openDevelopTool();//供给前端调用的打开谷歌开发者界面的接口,这个所有项目中都不用改动,只要在前端特定的情况下(例如按下某个按钮)调用就可以
    void jscall(const QString &datafromjs);//测试例子


signals:
    void someattribute_1_change();
    void someattribute_2_change();

};

#endif // WEBCLASS_H
